from rest_framework import serializers
from django_redis import get_redis_connection



# /sms_codes/(?P<mobile>1[3-9]\d{9})/?image_code_id=xxx&text=xxx
class ImageCodeCheckSerializer(serializers.Serializer):
    text = serializers.CharField(max_length=4, min_length=4)
    image_code_id = serializers.UUIDField()
    def validate(self, attrs):
        image_code_id = attrs.get('image_code_id', '')
        text = attrs.get('text', '')
        # 创建ｒｅｄｉｓ连接
        redis_conn = get_redis_connection('verify_codes')
        real_image_id = redis_conn.get('img_%s' % image_code_id)
        # 在获取到数据库的图形验证码之后就可以删除了，防止暴力测试一个验证码，
        # 如果在not real_image_id之后再删除的话，没有获取到就抛出异常了，还是无法防止
        # 这个时候的ｔｅｘｔ已经保存在real_image_id变量中了
        redis_conn.delete('img_%s' % image_code_id)
        if not real_image_id:
            raise serializers.ValidationError('数据不存在')
        real_image_id = real_image_id.decode()
        if text.lower() != real_image_id.lower():
            raise serializers.ValidationError('图形验证码错误')
        # 用户在１分钟的时效内不可以重复频繁发送短信验证码
        # 因为前段可以限制，但是不能防止用户直接对接到后台，所以这里也要做限制
            # 判断是否在60s内
            # 在序列化器对象中与context属性，通过get_serializer创建序列化器对象的时候，drf会向context补充三个值，request view format
            # Django的类视图的特点，在接受到请求后，创建类视图对象的时候，会将解析的路径正则参数保存到类视图对象中的kwargs属性
            # self.context['view'] # 视图对象
        mobile = self.context['view'].kwargs['mobile']
        real_data = redis_conn.get('send_flag_%s' % mobile)
        if real_data:
            raise serializers.ValidationError('发送过于频繁')
        return attrs
